﻿using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using ExceptionReporting;
using SmartHealthCare.Properties;
using SmartHealthCareDbLayer;

namespace SmartHealthCare.Frm
{
    public partial class FrmClientes : Form
    {
        public FrmClientes()
        {
            InitializeComponent();
        }
        private int _row;
        private Clientes _current;


        private void NewToolStripButtonClick(object sender, EventArgs e)
        {
            try
            {
                //desbloque la edicion de los controles;
                //y limpio los controles
                Utils.Util.ReadOnly(this, false);
                Utils.Util.Limpiar(this);
                Utils.Util.YellowColor(this);//coloreo los textboxes de amarillo
                //pongo el foco en el textbox de la descripcion
                _current = null;
                _txtNombre.Focus();
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }

        }

        private void OpenToolStripButtonClick(object sender, EventArgs e)
        {
            try
            {
                var obje = Utils.Util.DeSerialise();

                if (obje.GetType() != typeof(Clientes)) return;

                if (!ModelSingle.Instance.Clientes.Contains((Clientes)obje))
                    ModelSingle.Instance.AddToClientes((Clientes)obje);

                ModelSingle.Instance.SaveChanges();
                //
                MessageBox.Show(Resources.FrmTiposDeCliente_OpenToolStripButtonClick_Importado_con_Exito_, Application.ProductName, MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }
        }

        private void ToolStripButton5Click(object sender, EventArgs e)
        {
            if (_current == null) return; // solo edito si ahi un registro activo.
            //
            //desbloque la edicion de los controles;
            //y limpio los controles
            Utils.Util.ReadOnly(this, false);
            // Utils.Util.Limpiar(this);
            Utils.Util.YellowColor(this);//coloreo los textboxes de amarillo
            //pongo el foco en el textbox de la descripcion
            _txtNombre.Focus();
        }

        private void SaveToolStripButtonClick(object sender, EventArgs e)
        {
            try
            {
                //busco el ultimo id en la tabla
                var id = ModelSingle.Instance.Clientes.Max(c => (int?)c.IdCliente);
                //pregunto si ahi un registro actual para modificarlo , sino lo creo con el nuevo id.
                //si ahi un ultimmo le sumo uno, si no, la tabla esta vacia y ahi k empesar en 1.
                var tipocliente = _current ?? Clientes.CreateClientes(id.HasValue ? id.Value + 1 : 1);
                tipocliente.Nombre = _txtNombre.Text; // la descripcion del registro.
                tipocliente.Identificacion = int.Parse(_txtIdentificacion.Text);
                tipocliente.Genero = _txtGenero.Text;
                tipocliente.TiposSeguro = _cbTipo.SelectedItem as TiposSeguro;
                tipocliente.FechaNacimiento = _dtFechaNacimiento.Value;
                tipocliente.Aseguradoras = _cbAseguradora.SelectedItem as Aseguradoras;
                tipocliente.CodigoSeguro = _txtSeguro.Text;
                tipocliente.TiposSeguro = _cbTipoSeguro.SelectedItem as TiposSeguro;
                //
                switch (tipocliente.EntityState)
                {
                    case EntityState.Added://si el registro es nuevo;
                    case EntityState.Detached:
                        ModelSingle.Instance.AddToClientes(tipocliente); //agrego a la coleccion
                        ModelSingle.Instance.SaveChanges(); //guardo los cambios.
                        break;
                    case EntityState.Modified:
                        ModelSingle.Instance.SaveChanges(); //como es una modificacion, guardo los cambios.
                        break;
                    default:
                        ModelSingle.Instance.SaveChanges(); //como creo que es una modificacion , guardo los cambios.
                        break;
                }
                //
                MessageBox.Show(@"Guardado con Exito.", @"Smart Health Care", MessageBoxButtons.OK,
                              MessageBoxIcon.Information);
                //
                Utils.Util.BlueColor(this);//to.do de azul ahora.
                Utils.Util.ReadOnly(this, true);// y que no se pueda escribir mas.
                UpDateLabel(); //actualizo el UI.

            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }
        }

        private void ToolStripButton1Click(object sender, EventArgs e)
        {
            _row = 0;// voi al inicio como el primer elemento es 0...
            Cargar();// y vuelvo a cargar
        }

        private void ToolStripButton2Click(object sender, EventArgs e)
        {
            _row = _row - 1;// me muevo asi atras restando uno
            Cargar();// y vuelvo a cargar
        }

        private void ToolStripButton3Click(object sender, EventArgs e)
        {
            _row = _row + 1;//me muevo asi ariba sumando uno 
            Cargar();// y vuelvo a cargar
        }

        private void ToolStripButton4Click(object sender, EventArgs e)
        {
            _row = ModelSingle.Instance.Clientes.AsParallel().Count() - 1;//busco el total de registros y le resto uno como el 1000 seria 999
            Cargar();// y vuelvo a cargar
        }
        public void Cargar()
        {
            if (_row < 0 || _row >= ModelSingle.Instance.Clientes.AsParallel().Count())
            {
                MessageBox.Show(Resources.FrmTiposDeCliente_Cargar_No_ahy_mas_Registros, Application.ProductName, MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                return;
            }
            try
            {
                _current = ModelSingle.Instance.Clientes.AsParallel()
                    .OrderBy(t => t.IdCliente)
                    .Skip(_row)
                    .Take(1)
                    .First();
                //   _row++;
                UpDateLabel();
                Mostrar(_current);
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }
        }

        private void UpDateLabel()
        {
            _lvlTotalRegistros.Text = string.Format("{0} de {1}", _row + 1,// row + 1 por que se empiesa a contar en 0 , so 1 = 0 ..
                                                    ModelSingle.Instance.Clientes.AsParallel().Count());
            Invalidate();
        }

        private void Mostrar(Clientes current)
        {
            _current = current;
            //
            _lvlCodigoCliente.Text = current.CodigoCliente;
            _cbTipo.SelectedItem = current.TiposCliente;
            _txtNombre.Text = current.Nombre.Trim();
            _txtIdentificacion.Text = current.Identificacion.ToString();
            _txtGenero.Text = current.Genero;
            if (current.FechaNacimiento != null) _dtFechaNacimiento.Value = current.FechaNacimiento.Value;
            _cbAseguradora.SelectedItem = current.Aseguradoras;
            _cbTipoSeguro.SelectedItem = current.TiposSeguro;
            _txtSeguro.Text = current.CodigoSeguro;

        }

        private void FrmClientes_Load(object sender, EventArgs e)
        {
            Utils.Util.ReadOnly(this, true);
            LoadData();
            Cargar();
        }

        private void LoadData()
        {
            var tipos = ModelSingle.Instance.TiposCliente.ToList();
            var aseguradoras = ModelSingle.Instance.Aseguradoras.ToList();
           
            //
            _cbTipo.DataSource = tipos;
            _cbTipo.ValueMember = "IdTipoCliente";
            _cbTipo.DisplayMember = "Descripcion";
            //
            _cbAseguradora.DataSource = aseguradoras;
            _cbAseguradora.ValueMember = "IdAseguradora";
            _cbAseguradora.DisplayMember = "Nombre";
           
        }

        private void TapViasEnter(object sender, EventArgs e)
        {
            _dgData.DataSource = (from h in ModelSingle.Instance.HistorialClinicoDetalle
                                  where h.HistorialClinico.IdPaciente == _current.IdCliente
                                  select new { h.Fecha, Medico = h.Medicos.Nombre, h.Nota }
                    ).ToList();
        }

        private void TabContactosEnter(object sender, EventArgs e)
        {
            _dgContacto.DataSource = (from c in _current.PersonasDeContacto
                                      select new
                                                 {
                                                     c.Nombre,
                                                     c.Parentescos.Descripcion
                                                 }).ToList();

        }

        private void CbAseguradoraSelectedIndexChanged(object sender, EventArgs e)
        {
            var aseguradora = ((ComboBox)sender).SelectedItem as Aseguradoras;
            if (aseguradora == null) return;
            //

            var tiposA = (from tipos in ModelSingle.Instance.TiposDeSeguroPorAseguradora.Where(t=>t.IdAseguradora == aseguradora.IdAseguradora  )
                          select tipos.TiposSeguro )
                .ToList();
            //
            _cbTipoSeguro.DataSource = tiposA;
            _cbTipoSeguro.ValueMember = "IdTipoSeguro";
            _cbTipoSeguro.DisplayMember = "Descripcion";
        }
    }
}
